package fr.asip.cps3.exemple.modele.ecouteurs;

import java.util.EventListener;

import fr.asip.cps3.exemple.modele.Application;
import fr.asip.cps3.exemple.modele.exceptions.ExceptionVue;
import fr.asip.cps3.exemple.modele.resultats.Resultat;

/**
 * Interface écouteur de l'application
 *
 */
public interface ApplicationEcouteur extends EventListener {
	
	/**
	 * Gère l'affichage du résultat
	 * @param resultat Résultat à afficher
	 * @throws ExceptionVue 
	 */
	public void afficheResultat(Resultat resultat) throws ExceptionVue;

	/**
	 * Gère le changement de librairie
	 * @param description Description de la nouvelle librairie
	 */
	public void chargementLibrairie(String description);

	/**
	 * Gère la notification de problème de chargement de librairie
	 * @param typeException Le type d'exception rencontrée
	 * @param application L'application
	 */
	public void problemeChargementLibrairie(int typeException, Application application);

	/**
	 * Mise à jour des menus
	 * @param application L'application
	 */
	public void majMenus(Application application);

	/**
	 * Gère l'affichage de l'écran
	 * @param typeEcran Le type d'écran à afficher
	 * @throws ExceptionVue 
	 */
	public void afficheEcran(int typeEcran) throws ExceptionVue;

	/**
	 * Gère l'affichage de l'écran avec prise en compte d'un objet nécessaire à l'opération
	 * @param typeEcran Le type d'écran à afficher
	 * @param objet Objet nécessaire pour l'opération
	 * @throws ExceptionVue 
	 */
	public void afficheEcran(int typeEcran,Object objet) throws ExceptionVue;
	
	/**
	 * Gère l'affichage de l'exception
	 * @param exception L'exception à afficher
	 */
	public void afficheException(Exception exception);
	
	/**
	 * Demande à l'utilisateur de connecter un lecteur
	 * @return Réponse utilisateur
	 */
	public int demandeConnexionLecteur();
	
	/**
	 * Demande à l'utilisateur d'insérer une carte supportée
	 * @return Réponse utilisateur
	 */
	public int demandeInsertionCarte();

	/**
	 * Demande à l'utilisateur de saisir le code porteur
	 * 
	 * @param nbEssais Le type de saisie (à N tentatives, à 3 tentatives)
	 * @param conformiteCodePorteur Flag permettant de déterminer le message à afficher
	 * @param numeroSerieCarte Numéro de série de la carte
	 * @return Tableau de 2 éléments, contenant le choix utilisateur [0] et le code porteur saisi [1]
	 */
	public Object[] demandeSaisieCodePorteur(long nbEssais, long conformiteCodePorteur, String numeroSerieCarte);	

	/**
	 * Demande à l'utilisateur de recycler le code porteur
	 * 
	 * @param nbEssais Flag permettant de déterminer le message à afficher concernant le nombre d'essai
	 * @param conformiteCodeDeblocage Etat de conformité du code de déblocage
	 * @param conformiteCodePorteur Etat de conformité du code porteur
	 * @param numeroSerieCarte Numéro de série de la carte
	 * @return Tableau de 4 éléments, contenant le choix utilisateur [0] et le code de déblocage [1], le 1er code porteur saisi [2] et le 2eme code porteur saisi [3]
	 */
	public Object[] demandeRecyclageCodePorteur(long nbEssais, long conformiteCodeDeblocage, long conformiteCodePorteur, String numeroSerieCarte);		
	
	/**
	 * Demande de choix du nombre d'essais possibles avant blocage du code porteur
	 * @return Réponse utilisateur
	 */
	public int demandeChoixNbEssaisPossiblesAvantBlocageCodePorteur();

	/**
	 * Demande d'action lecteur (retrait/connexion) ou carte (retrait/insertion)
	 *
	 * @param typeAction Le type d'action à demander
	 * @param numeroSerieCarte Numéro de série de la carte
	 * @return Réponse utilisateur
	 */	
	public int demandeActionLecteurCarte(int typeAction, String numeroSerieCarte);

	/**
	 * Déclenche l'alerte de carte retrouvée
	 */	
	public void declencheAlerteCarteRetrouvee();
	
	/**
	 * Déclenche l'alerte de carte retrouvée
	 * 
	 * @param valeur Valeur à modifier
	 * @return Tableau de 2 éléments, contenant le choix utilisateur [0] et le valeur de l'attribut modifiée [1]
	 */	
	public Object[] declencheDemandeModificationObjetDonneesApplicatives(byte[] valeur);
	
}
